/**
 * Created by John on 2016/6/7.
 */
exports.book = {
    '书名': 'MongoDB 入门经典',
    '目录': [
        {
            '第1章': 'NoSQL 和 MongoDB 简介',
            '1.1': 'NoSQL 是什么',
            '1.1.1': '文档存储数据库',
            '1.1.2': '键值数据库',
            '1.1.3': '列存储数据库',
            '1.1.4': '图存储数据库',
            '1.2': '选择 DRBMS、NoSQL 还是两者',
            '1.3': '理解 MongoDB',
            '1.3.1': '理解集合',
            '1.3.2': '理解文档',
            '1.4': 'MongoDB 数据类型',
            '1.5': '规划数据模型',
            '1.5.1': '使用文档引用范式化数据',
            '1.5.2': '使用嵌入式文档对数据进行反范式化',
            '1.5.3': '使用固定集合',
            '1.5.4': '理解原子写入操作',
            '1.5.5': '考虑文档增大',
            '1.5.6': '找出可使用索引、分片和复制的情形',
            '1.5.7': '使用大型集合还是大量集合',
            '1.5.8': '确定数据的生命周期',
            '1.5.9': '考虑数据可用性和性能',
            '1.6': '小结',
            '1.7': '问与答',
            '1.8': '作业',
            '1.8.1': '小测试',
            '1.8.2': '小测试答案',
            '1': '反范式化文档包含子文档，而范式化文档的子文档存储在另一个集合中',
            '2': '对',
            '3': '固定集合让您能够对集合的大小或存储的文档数进行限制，从而只保留最新的文档',
            '1.8.3': '练习'
        },
        {
            '第2章': '安装和配置 MongoDB',
            '2.1': '搭建 MongoDB 环境',
            '2.1.1': '安装 MongoDB',
            '2.1.2': '启动 MongoDB',
            '2.1.3': '配置 MongoDB',
            '2.1.4': '停止 MongoDB',
            '2.2': '访问 MongoDB HTTP 接口',
            '2.3': '从 MongoDB shell 访问 MongoDB',
            '2.3.1': '启动 MongoDB shell',
            '2.3.2': '理解 MongoDB shell 命令',
            '2.3.3': '理解 MongoDB shell 原生方法和构造函数',
            '2.3.4': '理解命令参数和结果',
            '2.4': 'MongoDB shell 脚本编程',
            '2.4.1': '使用命令行选项 --eval 执行 JavaScript 表达式',
            '2.4.2': '在 MongoDB shell 中使用方法 load() 来执行脚本',
            '2.4.3': '在命令 mongo 中指定要执行的 JavaScript 文件',
            '2.5': '小结',
            '2.6': '问与答',
            '2.7': '作业',
            '2.7.1': '小测试',
            '1': '执行 JavaScript 表达式',
            '2': 'Show dbs',
            '3': '配置文件更灵活，方便修改',
            '2.7.2': '小测试答案',
            '2.7.3': '练习'
        },
        {
            '第3章': '在 MongoDB shell 中使用 JavaScript',
            '3.1': '变量',
            '3.2': '理解 JavaScript 数据类型',
            '3.3': '在 MongoDB shell 脚本中输出数据',
            '3.4': '使用运算符',
            '3.4.1': '算术运算符',
            '3.4.2': '赋值运算符',
            '3.4.3': '比较运算符和条件语句',
            '3.5': '循环',
            '3.5.1': 'while 循环',
            '3.5.2': 'do/while 循环',
            '3.5.3': 'for 循环',
            '3.5.4': 'for/in 循环',
            '3.5.5': '中断循环',
            '3.6': '创建函数',
            '3.6.1': '定义函数',
            '3.6.2': '向函数传递变量',
            '3.6.3': '从函数返回值',
            '3.6.4': '使用匿名函数',
            '3.7': '理解变量作用域',
            '3.8': '使用 JavaScript 对象',
            '3.8.1': '使用对象语法',
            '3.8.2': '创建自定义对象',
            '3.8.3': '使用原型对象模式',
            '3.9': '操作字符串',
            '3.9.1': '合并字符串',
            '3.9.2': '在字符中搜索子串',
            '3.9.3': '替换字符串中的单词',
            '3.9.4': '将字符串分割成数组',
            '3.10': '使用数组',
            '3.10.1': '合并数组',
            '3.10.2': '迭代数组',
            '3.10.3': '将数组转换为字符串',
            '3.10.4': '检查数组是否包含特定的元素',
            '3.10.5': '在数组中增删元素',
            '3.11': '添加错误处理',
            '3.11.1': 'try/catch 块',
            '3.11.2': '引发自定义错误',
            '3.11.3': '使用 finally',
            '3.12': '小结',
            '3.13': '问与答',
            '3.14': '作业',
            '3.14.1': '小测验',
            '1': 'Array.concat()',
            '2': 'user.name',
            '3': '错',
            '4': 'Array.slice(0)',
            '5': 'Array.length',
            '3.14.2': '小测验答案',
            '3.14.3': '练习'
        },
        {
            '第4章': '配置用户账户和访问控制',
            '4.1': '理解 admin 数据库',
            '4.2': '管理用户账户',
            '4.2.1': '创建用户账户',
            '4.2.2': '列出用户',
            '4.2.3': '删除用户',
            '4.3': '配置访问控制',
            '4.3.1': '创建用户管理员账户',
            '4.3.2': '启用微分验证',
            '4.3.3': '创建数据库管理员账户',
            '4.4': '小结',
            '4.5': '问与答',
            '4.6': '作业',
            '4.6.1': '小测验',
            '1': 'read',
            '2': 'db.removeUser()',
            '3': '错',
            '4': '错',
            '5': '--auth 参数',
            '4.6.3': '练习'
        },
        {
            '第5章': '在 MongoDB shell 中管理数据库和集合',
            '5.1': '理解 Database 和 Collection 对象',
            '5.1.1': '理解 Connection 对象',
            '5.1.2': '理解 Database 对象',
            '5.1.3': '理解 Collection 对象',
            '5.2': '管理数据库',
            '5.2.1': '显示数据列表',
            '5.2.2': '切换到其他数据库',
            '5.2.3': '创建数据库',
            '5.3': '管理集合',
            '5.3.1': '显示数据库的集合列表',
            '5.3.2': '创建集合',
            '5.4': '实现示例数据集',
            '5.4.1': '理解示例数据集',
            '5.5': '小结',
            '5.6': '问与答',
            '5.7': '作业',
            '5.7.1': '小测试',
            '1': 'show dbs',
            '2': 'use database, 再创建用户或集合',
            '3': '错',
            '4': 'db.stats()',
            '5.7.2': '小测试答案',
            '5.7.3': '练习'
        },
        {
            '第6章': '使用 MongoDB shell 在 MongoDB 集合中查找文档',
            '6.1': '理解 Cursor 对象',
            '6.2': '理解查询运算符',
            '6.3': '从集合中获取文档',
            '6.4': '查找特定的文档',
            '6.4.1': '根据特定的字段值查找文档',
            '6.4.2': '根据字段值数组查找文档',
            '6.4.3': '根据字段值的大小查找文档',
            '6.4.4': '根据数组字段的长度查找文档',
            '6.4.5': '根据子文档中的值查找文档',
            '6.4.6': '根据数组字段的内容查找文档',
            '6.4.7': '根据字段是否存在查找文档',
            '6.4.8': '根据子文档数组中的字段查找文档',
            '6.5': '小结',
            '6.6': '问与答',
            '6.7': '作业',
            '6.7.1': '小测验',
            '1': '错',
            '2': 'count() size()',
            '3': '$in',
            '4': '数组长度',
            '6.7.3': '练习'
        },
        {
            '第7章': '使用 MongoDB shell 执行其他数据查找操作',
            '7.1': '计算文档数',
            '7.2': '对结果集进行排序',
            '7.3': '限制结果集',
            '7.3.1': '限制结果集的大小',
            '7.3.2': '限制返回的字段',
            '7.3.3': '结果集分页',
            '7.4': '查找不同的字段值',
            '7.5': '小结',
            '7.6': '问与答',
            '7.7': '作业',
            '7.7.1': '小测验',
            '1': 'result.limit(10)',
            '2': 'collection.distinct(age)',
            '3': 'collection.sort({name:-1})',
            '4': '错，可使用 skip() 跳过游标中的文档',
            '7.7.2': '小测验答案',
            '7.7.3': '练习'
        },
        {
            '第8章': '操作集合中的 MongoDB 文档',
            '8.1': '理解写入关注',
            '8.2': '配置数据库连接错误处理',
            '8.3': '获取数据库写入请求的状态',
            '8.4': '理解数据库更新运算符',
            '8.5': '使用 MongoDB shell 在集合中添加文档',
            '8.6': '使用 MongoDB shell 更新集合中的文档',
            '8.7': '使用 MongoDB shell 将文档保存到集合中',
            '8.8': '使用 MongoDB shell 在集合中更新或插入文档',
            '8.9': '使用 MongoDB shell 从集合中删除文档',
            '8.10': '小结',
            '8.11': '问与答',
            '8.12': '作业',
            '8.12.1': '小测验',
            '1': '1',
            '2': 'update 方法的 multi 参数设为 false',
            '3': '错',
            '4': 'insert 方法参数传入一个数组',
            '8.12.2': '小测验答案',
            '8.12.3': '练习'
        },
        {
            '第9章': '使用分组、聚合和映射-归并',
            '9.1': '在 MongoDB shell 中对查找操作的结果进行分组',
            '9.2': '从 MongoDB shell 发出请求时使用聚合来操作数据',
            '9.2.1': '理解方法 aggregate()',
            '9.2.2': '使用聚合框架运算符',
            '9.2.3': '使用聚合表达式运算符',
            '9.3': '在 MongoDB shell 中使用映射-归并生成新的数据结果',
            '9.3.1': '理解方法 mapReduce()',
            '9.4': '小结',
            '9.5': '问答',
            '9.6': '作业',
            '9.6.1': '小测验',
            '1': '提供一个键和值',
            '2': '调用 mapReduce() 方法时指定 out:{inline:1} 参数',
            '3': '使用 $group() 运算符',
            '4': '错',
            '9.6.2': '小测验答案',
            '9.6.3': '练习'
        },
        {
            '第19章': '在 Node.js 应用程序中实现 MongoDB',
            '19.1': '理解 Node.js MongoDB 驱动程序中的对象',
            '19.1.1': '理解回调函数',
            '19.1.2': '理解 Node.js 对象 MongoClient',
            '19.1.3': '理解 Node.js 对象 Database',
            '19.1.4': '理解 Node.js 对象 Collection',
            '19.1.5': '理解 Node.js 对象 Cursor',
            '19.1.6': '理解用于表示参数和文档的 Node.js JavaScript 对象',
            '19.1.7': '设置写入关注和其他请求选项',
            '19.2': '使用 Node.js 查找文档',
            '19.2.1': '使用 Node.js 从 MongoDB 获取文档',
            '19.2.2': '使用 Node.js 在 MongoDB 数据库中查找特定的文档',
            '19.3': '使用 Node.js 计算文档数',
            '19.4': '使用 Node.js 对结果集排序',
            '19.5': '小结',
            '19.6': '问与答',
            '19.7': '作业',
            '19.7.1': '小测验',
            '1': '传入一个查询参数',
            '2': '给 sort() 方法传入一个 {name:1} 的参数',
            '3': '调用文档的指定行的字段的属性',
            '4': '错',
            '19.7.2': '小测验答案',
            '19.7.3': '练习'
        },
        {
            '第20章': '在 Node.js 应用程序中访问 MongoDB 数据库',
            '20.1': '使用 Node.js 限制结果集',
            '20.1.1': '使用 Node.js 限制结果集大小',
            '20.1.2': '使用 Node.js 限制返回的字段',
            '20.1.3': '使用 Node.js 将结果集分页',
            '20.2': '使用 Node.js 查找不同的字段值',
            '20.3': '在 Node.js 应用程序中对查找操作结果进行分组',
            '20.4': '在 Node.js 应用程序发出请求时使用聚合来操作数据',
            '20.5': '小结',
            '20.6': '问与答',
            '20.7': '作业',
            '20.7.1': '小测验',
            '1': 'skip(20), limit(10)',
            '2': 'distinct()',
            '3': 'limit(10)',
            '4': 'find() 方法的参数 options 的属性值设置为 false',
            '20.7.2': '小测验答案',
            '20.7.3': '练习'
        },
        {
            '第21章': '在 Node.js 应用程序中操作 MongoDB 数据',
            '21.1': '使用 Node.js 添加文档',
            '21.2': '使用 Node.js 删除文档',
            '21.3': '使用 Node.js 保存文档',
            '21.4': '使用 Node.js 更新文档',
            '21.5': '使用 Node.js 更新或插入文档',
            '21.6': '小结',
            '21.7': '问答',
            '21.8': '作业',
            '21.8.1': '小测验',
            '1': '使用 Update() 方法，并设置 insert 选项为真',
            '2': '将 Update() 方法的 multi 选项设为假',
            '3': '错',
            '4': '第2个参数 update 并使用更新运算符',
            '21.8.2': '小测验答案',
            '21.8.3': '练习'
        },
        {
            '第22章': '使用 MongoDB shell 管理数据库',
            '21.1': '管理数据库和集合',
            '21.1.1': '复制数据库',
            '21.1.2': '重命名集合',
            '21.1.3': '创建固定集合',
            '22.2': '管理索引',
            '22.2.1': '添加索引',
            '22.2.2': '删除索引',
            '22.2.3': '重建索引',
            '22.3': '理解性能和诊断任务',
            '22.3.1': '查看数据库和集合的统计信息',
            '22.3.2': '检查数据库',
            '22.3.3': '剖析 MongoDB',
            '22.3.4': '评估查询',
            '22.4': '修复 MongoDB 数据库',
            '22.5': '备份 MongoDB 数据库',
            '22.6': '小结',
            '22.7': '问与答',
            '22.8': '作业',
            '22.8.1': '小测验',
            '1': '使用命令行工具传入 top:1 参数',
            '2': '使用数据库调用 repairDatabase() 方法',
            '3': '使用重命名方法 renameCollection() 方法并传入 dropTarget:true 参数',
            '4': '使用 ensureIndex() 方法并传入 {name:1, number:1}, {unique:true} 参数',
            '22.8.2': '小测验答案',
            '22.8.3': '练习'
        },
        {
            '第23章': '在 MongoDB 中实现复制和分片',
            '23.1': '在 MongoDB 中实现复制',
            '23.1.1': '理解复制策略',
            '23.1.2': '部署副本集',
            '23.2': '在 MongoDB 中实现分片',
            '23.2.1': '理解分片服务器的类型',
            '23.2.2': '选择片键',
            '23.2.3': '选择分区方法',
            '23.2.4': '部署 MongoDB 分片集群',
            '23.3': '小结',
            '23.4': '问与答',
            '23.5': '作业',
            '25.5.1': '小测验',
            '1': '连接到 mongos 服务器,使用 sh.status()',
            '2': '连接到主服务器，在 shell 中使用 rs.status()',
            '3': '选举新主服务器',
            '4': '查询服务器 mongos',
            '23.5.3': '练习'
        }
    ],
    '附录': ''
};